home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / tex / atcomp16.zip / @COMPARE.DOC next >
Encoding:
Text File  |  1994-01-26  |  26.2 KB  |  554 lines

  1.                         ╔═════════════════════════╗
  2. ════════════════════════╣  @Compare, version 1.6  ╠════════════════════════
  3. ════════════════════════╣     Brian C. Madsen     ╠════════════════════════
  4.                         ╚═════════════════════════╝
  5.  
  6.  
  7.  
  8. COPYRIGHTS AND DISCLAIMERS:  ══════════════════════════════════════════════
  9.  
  10. @Compare is copyright 1988-1994 by Brian C. Madsen.  This copyright applies
  11. to the source code, the executable program, and this documentation, and to
  12. all past and future versions of this program which have been or will be
  13. produced by the author.  All rights are reserved, including the right to
  14. market this product for profit.  Although @Compare is copyrighted, it may
  15. be freely distributed, so long as it is accompanied by this documentation,
  16. and so long as neither the program nor this documentation is altered in any
  17. way.  The author will not be held legally responsible for unforseen side
  18. effects arising from the use of this program, and your use of this program
  19. constitutes your agreement to this copyright notice and disclaimer.
  20.  
  21.  
  22.  
  23. DESCRIPTION:  ═════════════════════════════════════════════════════════════
  24.  
  25. @Compare works on Ascii files which are roughly similar to each other (for
  26. example, a .PAS and its .BAK file; a document and an earlier version of
  27. the same document; or data created via double data entry.)  Files to be
  28. compared may be of unlimited length.
  29.  
  30. @Compare matches up the two files, displaying them side by side, and dis-
  31. playing the similarities and differences between them.  Equal lines are
  32. marked by an equal sign on both sides of the screen; discrepancies in
  33. similar but unequal lines are highlighted; and lines which exist in one
  34. file and which have no corresponding counterpart in the other file are
  35. displayed as such.
  36.  
  37.  
  38.  
  39. CHANGES SINCE VERSION 1.5 ═════════════════════════════════════════════════
  40.  
  41. The following features have been added, and problems resolved, since the
  42. last release of @Compare.  Feel free to skip this section if you are new
  43. to @Compare.
  44.  
  45. 1.  A bug has been fixed which caused range check errors when very large
  46.     files were @Compared, or when very long stretches occurred between
  47.     differences in files.
  48.  
  49. 2.  My address has changed.
  50.  
  51. 3.  Version number and copyright dates have been updated throughout.
  52.  
  53.  
  54.  
  55. OPERATION:  ═══════════════════════════════════════════════════════════════
  56.  
  57.     At a glance:  @Compare [-PFMTHARCLEBQ] [filename.one [filename.two]]
  58.  
  59. @Compare accepts an options parameter and the names of one or two files as
  60. command line arguments.  The options parameter, if it is present, must be
  61. the first in the list of command line parameters, and it must begin with a
  62. / or -.  If none of these parameters is given, a usage reminder is printed
  63. and the program prompts for them.
  64.  
  65. Legal options are as follows:
  66.  
  67.     P -- directs output to the printer.
  68.  
  69.     F -- directs output to a file.  The program prompts for the name of
  70.          this file, which defaults to @Compare.@@@. The file will be over-
  71.          written if it already exists. The F parameter takes precedence
  72.          over the P parameter if both are specified.
  73.  
  74.     M -- writes to the screen in black and white, instead of the default
  75.          colors.  This is intended for use with monochrome monitors.
  76.  
  77.     T -- suppresses the printing of the program's title.
  78.  
  79.     H -- suppresses highlighting of discrepancies in unequal lines.  This
  80.          highlighting is done on a character by character basis.  It shows
  81.          up as underlining on the printer, and does not show up in the
  82.          @Compare.@@@ file.
  83.  
  84.     A -- replaces all occurrences of extended Ascii graphics characters
  85.          (┼, ╬, ║, ╒, and so on) with standard Ascii characters (|, =,
  86.          +, *).  This is designed for use with printers which can't print
  87.          the graphics characters, although the A option takes effect
  88.          whether output is directed to the printer, to a file, or to the
  89.          screen.  This option only affects the graphics characters
  90.          produced by @Compare: if the files being compared contain
  91.          extended Ascii graphics characters, they will not be translated
  92.          when printed.
  93.  
  94.     R -- sends reports of discrepancies to two files.  The program prompts
  95.          for the names of these files, which default to @Compare.@R@ and
  96.          @Compare.@S@, and which will be overwritten if they already
  97.          exist.  This option was designed to be used on files containing
  98.          data in fields and columns, and it is probably most useful in
  99.          that case, but it works well when used on other files.  This op-
  100.          tion is described more fully in a later section of this document.
  101.  
  102.     C -- overrides the page breaks which occur whenever the screen in full
  103.          of output, resulting in a continuous scroll of information on the
  104.          screen.  This parameter is only meaningful if P and F parameters
  105.          are not specified, or in other words, it only takes effect if
  106.          output is directed to the screen.
  107.  
  108.     L -- does a longer search than usual to find matching lines.
  109.     E -- does an extra long search to find matching lines.
  110.          These more thorough searches slow down execution of the program,
  111.          and shouldn't be necessary for most operations.
  112.  
  113.     B -- suppresses direct video writes, and uses BIOS calls to write to
  114.          the screen.  BIOS calls are slower, but sometimes necessary, such
  115.          as in the case where DESQview requires them to prevent bleeding.
  116.  
  117.     Q -- quits the program.  If you invoke the program without command
  118.          line parameters, and all you want to do is view the usage
  119.          reminder, enter Q at the options prompt.
  120.  
  121.  
  122. Examples of operation:
  123.  
  124. Two versions of an Ascii document can be compared by typing:
  125. @Compare Ascii1.doc Ascii2.doc
  126.  
  127. This comparison may be directed to a file by typing:
  128. @Compare /f Ascii1.doc Ascii2.doc
  129.  
  130. The comparison may be directed to the printer, with the title and high-
  131. lighting suppressed, with the command:
  132. @Compare -PTH Ascii1.doc Ascii2.doc
  133.  
  134. If only one filename is specified on the command line, it will be
  135. assumed that the second filename is the corresponding .BAK file, if one
  136. exists.  In other words, the following two commands are equivalent:
  137. @Compare Ascii.doc
  138. @Compare Ascii.doc Ascii.bak
  139.  
  140. If you issue the command "@Compare Ascii.doc", and @Compare can't find
  141. the Ascii.bak file, @Compare will prompt for a second file name.
  142.  
  143.  
  144.  
  145. THE @COMPARE ENVIRONMENT VARIABLE:  ═══════════════════════════════════════
  146.  
  147. Some of the information in the previous section is modified by the DOS
  148. environment variable @COMPARE, if it exists.  This variable is absolutely
  149. optional, and @Compare will function just fine without it.  However, you
  150. may want to use it to customize @Compare's operation.
  151.  
  152. It is outside the scope of this document to explain environment variables.
  153. For more information, consult your DOS manual.  Because @Compare doesn't
  154. require the @COMPARE environment variable, you can safely skip this
  155. section if you don't know about the DOS environment.
  156.  
  157. If @Compare finds the @COMPARE variable in the environment, the environ-
  158. ment string is used to modify @Compare's operation in two ways.
  159.  
  160. FIRST OF ALL, part of the environment string, as explained below, sup-
  161. plants "bak" as the backup file extension.  As explained in the previous
  162. section, the command "@Compare Ascii.doc" is equivalent to the command
  163. "@Compare Ascii.doc Ascii.bak".  That is, if the user does not specify a
  164. second file name, @Compare assumes that the second file name should be the
  165. backup version of the first file name, and acts accordingly.
  166.  
  167. Now, let's say your editor creates backup files with an extension other
  168. than .BAK, say .BCK, or .BKP, etc.  Or, let's say you're comparing doubly-
  169. entered data with the report option, and that your first dataset is called
  170. DATA.001 and your second is called DATA.002.  With the @COMPARE environ-
  171. ment variable, you can tell @Compare what to look for as a default second
  172. file extension. In this way, "@Compare Ascii.doc" would mean the same
  173. thing as "@Compare Ascii.doc Ascii.bck" (or "@Compare Ascii.doc Ascii.bkp",
  174. or whatever). Similarly, you could use this feature to set up @Compare
  175. such that "@Compare DATA.001" becomes equivalent to "@Compare DATA.001
  176. DATA.002".
  177.  
  178. SECOND OF ALL, another part of the environment string, as explained below,
  179. is prefixed to the user's options list; or, if the user doesn't provide an
  180. options list, the second part of the environment string becomes the
  181. options list.  In this way, if your monitor is monochrome, and you don't
  182. want to enter the -M option all the time, you can set the environment
  183. variable to always prefix the M option before whatever other options you
  184. specify.  Or, for example, if you don't like seeing my name in the title
  185. header, you can put the -T option in the environment string, and from then
  186. on, @Compare will operate with the title header off, whether you enter -T
  187. on the command line or not.
  188.  
  189. So, on with the gritty details about how to define the environment string.
  190. The environment string comes in three formats -- which is really only one
  191. format, with two optional parts.
  192.  
  193. If your text editor creates .BK! backups (and I'm told WordPerfect does
  194. this), put the following line in your AUTOEXEC.BAT file:
  195.  
  196. SET @COMPARE=BK!
  197.  
  198. If you always want to run in continuous mode, on a monochrome monitor, and
  199. convert graphics characters to ASCII graphics, put the following line in
  200. your AUTOEXEC.BAT file:
  201.  
  202. SET @COMPARE=/CMA
  203.  
  204. or
  205.  
  206. SET @COMPARE=-CMA
  207.  
  208. If you want to do both of these at the same time, combine both parts in
  209. the environment string, as follows:
  210.  
  211. SET @COMPARE=BK!/CMA
  212.  
  213. or
  214.  
  215. SET @COMPARE=BK!-CMA
  216.  
  217. Note that the backup extension MUST come first.  Note that the options
  218. must be preceded by either a slash or a hyphen.  Note that if you specify
  219. an empty filename extension (in other words, if you only specify options,
  220. such as SET @COMPARE=-M), @Compare will look for .BAK backup files, as
  221. explained in the previous section.
  222.  
  223.  
  224.  
  225. THE DOS ERRORLEVEL:  ══════════════════════════════════════════════════════
  226.  
  227. @Compare sets the DOS ERRORLEVEL upon completion.  This allows programmers
  228. to write batch files to compare files or sets of files, and to behave in
  229. various ways depending on the equality or inequality of the files being
  230. compared.
  231.  
  232. It is beyond the scope of this document to explain the DOS ERRORLEVEL.
  233. For more information, consult your DOS manual's section on batch files.
  234.  
  235. @Compare keeps track of the number of differences encountered between the
  236. two files being compared.  This is reported upon completion in a message
  237. like the following:
  238.  
  239. File SanDiego.doc has 414 lines.
  240. File SanDiego.bak has 410 lines.
  241. The files contain 37 mismatches.
  242.  
  243. The ERRORLEVEL is set to the number of mismatches, in this case 37.  If
  244. both files are equal, the ERRORLEVEL is set to 0.  Thus, batch files can
  245. test two files for equality by testing the ERRORLEVEL for zero or nonzero
  246. values.
  247.  
  248. (In case it is of interest, the ERRORLEVEL is set to 255 if the user
  249. specifies the Q option on the command line or at the usage reminder
  250. prompt.  The ERRORLEVEL is set to 254 if the user specifies an invalid
  251. first or second file name.  Otherwise, the ERRORLEVEL is never set to any
  252. value greater than 253.)
  253.  
  254.  
  255.  
  256. THE REPORT OPTION:  ═══════════════════════════════════════════════════════
  257.  
  258. The report option was designed to be used with data which is stored as
  259. several rows (cases) of fields (variables).  Suppose, for example, that
  260. you have several rows of data in which columns 1 through 9 represent a
  261. patient's social security number, columns 10 through 19 represent the
  262. surname, column 20 represents gender, and columns 21 through 26 represent
  263. the birthdate.  With the R option, you can specify these field ranges, and
  264. @Compare will create a summary of the discrepancies found within each of
  265. these fields.  If, in the birthdate field, your first file gives 043064
  266. and your second file gives 043164, the R option will print information
  267. about the case in question, including the variable name and the differing
  268. values.  This process will be described in more detail below.  If this
  269. option is not of interest to you, skip this section and the following one.
  270.  
  271. When the program is first invoked, the program will open the two files to
  272. be compared and read them into memory.  If the R option is specified, it
  273. will then ask you to enter the fields to be reported.  The format to use
  274. is:  variable name, starting column, length of variable.  Using the
  275. example of the last paragraph, this information would be entered as
  276. follows, where # is the prompt issued by @Compare:
  277.  
  278. # SSN,1,9
  279. # Last Name,10,10
  280. # Sex,20,1
  281. # Birth Date,21,6
  282. # $Endfile
  283.  
  284. You can enter as many variable fields as you like.  They need not be in
  285. any order, and they can freely overlap.  The list of variable fields is
  286. terminated by the string "$Endfile" or the string "%EOF".  These strings
  287. are not case sensitive.
  288.  
  289. Since you may have scores of variable fields in your dataset, an
  290. alternative to such extensive typing has been provided.  The command
  291. file=filename.ext specifies a file containing this information, or a
  292. subset of it.  If the file specified is found, the program will echo the
  293. variable field definitions contained in the file, which will continue
  294. until the end of the file, or until an error is found in the file.  If an
  295. end of file string ("$endfile" or "%eof") is not included in the file, the
  296. program will return to interactive mode and wait for more input.
  297.  
  298. When entering the variable field lists, the following cautions should be
  299. kept in mind.  First, the comma is the delimiter, and there must be two of
  300. them unless the line is an end of file string.  There can be no spaces
  301. before the commas, and the numeric fields must be numeric and positive.
  302. Any of these errors will cause an "invalid entry" message, and will prompt
  303. the user for more input.  If the "length of variable" field is zero, this
  304. variable will be ignored.
  305.  
  306. The first entry in your list of variables has a special meaning.  Since
  307. this option was designed for use on data sets where one of the variables
  308. would be a case number or a social security number which should match
  309. across both files, the first entry in your list is called a "key
  310. variable."  The key variable value should match between the two files
  311. (after all, it doesn't make any sense to compare different cases), and if
  312. it does, that value is the first of six columns printed in the report. If
  313. it doesn't, then a warning message to that effect is printed.
  314.  
  315. Because the first variable is the key variable, if your key value (say,
  316. the social security number variable) should be other than the first of
  317. several variables reading sequentially from left to right, you should
  318. enter it first anyway, even though it may be out of sequence.
  319.  
  320. If your key variable is defined to be of length zero, then the first
  321. column will contain blanks, and no warning messages will be printed.  This
  322. has the effect of turning off key variable error checking, since key
  323. variables of length zero will *always* match.
  324.  
  325. If the only variable in your list is an end of file string ("$endfile" or
  326. "%eof"), then the default values for this feature will be enabled.  The
  327. default values are columns 1-10, columns 11-20, etc., with the key vari-
  328. able turned off as described above.
  329.  
  330. Once the field definitions have been entered, the program will then prompt
  331. you for two more filenames.  The first of these, which defaults to
  332. @Compare.@R@, will contain the report of discrepancies in order from top
  333. to bottom and left to right.  The second of these, which defaults to
  334. @Compare.@S@, will contain the report of discrepancies in order as they
  335. were given in your list of field definitions.  @R@ stands for "report" and
  336. @S@ stands for "sorted report."
  337.  
  338.  
  339.  
  340. EXAMPLES OF THE REPORT OPTION:  ═══════════════════════════════════════════
  341.  
  342. Consider three files, called Example1.dat, Example2.dat, and Example.fil.
  343.  
  344. Example1.dat contains:
  345.  
  346. 123456789Madsen    M043064
  347. 234567890Kopotic   F071662
  348. 345678901Knepper   M092465
  349. 456789012Roman     F050764
  350. 567890123Kley      F030364
  351. 678901234Na        M102664
  352.  
  353. Example2.dat contains:
  354.  
  355. 123456789Madsen    M043164
  356. 234567890Kopotic   F071662
  357. 456789012Roman     F050764
  358. 567899123Clay      M030364
  359. 678901234Arthur    M120664
  360.  
  361. And Example.fil contains:
  362.  
  363. SSN,1,9
  364. Last Name,10,10
  365. Sex,20,1
  366. Birth Date,21,6
  367. $Endfile
  368.  
  369. I issue the command:
  370. @Compare -rt Example1.dat Example2.dat
  371.  
  372. The program asks me for variable field definitions, to which I respond:
  373. file=example.fil
  374.  
  375. It then asks me for a report file name and a sorted report file name, to
  376. which I respond by hitting the carriage return to accept the defaults.
  377.  
  378. The program then responds as usual, and when it is done, the file
  379. @Compare.@R@ contains the following report:
  380.  
  381. ┌───────────────╥───────────────╥──────────────────────╥──────────────────────┐
  382. │   Key Value   ║   Var Name    ║     Example1.dat     ║     Example2.dat     │
  383. ├───────────────╫───────────────╫──────┬───────────────╫──────┬───────────────┤
  384. │               ║               ║ Line │     Value     ║ Line │     Value     │
  385. ╞═══════════════╬═══════════════╬══════╪═══════════════╬══════╪═══════════════╡
  386. │     123456789 ║    Birth Date ║    1 │        043064 ║    1 │        043164 │
  387. ├───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┤
  388. │                            ! ! ! WARNING ! ! !                              │
  389. │            Line    3 of Example1.dat not found in Example2.dat.             │
  390. ├───────────────╥───────────────╥──────┬───────────────╥──────┬───────────────┤
  391. │     567890123 ║           SSN ║    5 │     567890123 ║    4 │     567899123 │
  392. ├───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┤
  393. │                            ! ! ! WARNING ! ! !                              │
  394. │               Key values in files (shown above) do not match!               │
  395. │                  Any discrepancies reported may be caused                   │
  396. │                     by different cases being compared.                      │
  397. ├───────────────╥───────────────╥──────┬───────────────╥──────┬───────────────┤
  398. │     567890123 ║     Last Name ║    5 │    Kley       ║    4 │    Clay       │
  399. │     567890123 ║           Sex ║    5 │             F ║    4 │             M │
  400. │     678901234 ║     Last Name ║    6 │    Na         ║    5 │    Arthur     │
  401. │     678901234 ║    Birth Date ║    6 │        102664 ║    5 │        120664 │
  402. └───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┘
  403.  
  404. The file @Compare.@S@ contains the following report:
  405.  
  406. ┌───────────────╥───────────────╥──────────────────────╥──────────────────────┐
  407. │   Key Value   ║   Var Name    ║     Example1.dat     ║     Example2.dat     │
  408. ├───────────────╫───────────────╫──────┬───────────────╫──────┬───────────────┤
  409. │               ║               ║ Line │     Value     ║ Line │     Value     │
  410. ╞═══════════════╬═══════════════╬══════╪═══════════════╬══════╪═══════════════╡
  411. │     567890123 ║           SSN ║    5 │     567890123 ║    4 │     567899123 │
  412. │     567890123 ║     Last Name ║    5 │    Kley       ║    4 │    Clay       │
  413. │     678901234 ║     Last Name ║    6 │    Na         ║    5 │    Arthur     │
  414. │     567890123 ║           Sex ║    5 │             F ║    4 │             M │
  415. │     123456789 ║    Birth Date ║    1 │        043064 ║    1 │        043164 │
  416. │     678901234 ║    Birth Date ║    6 │        102664 ║    5 │        120664 │
  417. └───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┘
  418.  
  419. Note that each of the discrepancies was reported.  Note that the @R@ file
  420. lists them in order by line number, and that the @S@ file lists them in
  421. order by variable name, in the order in which they were defined in the
  422. Example.fil file.
  423.  
  424. Next, suppose Example.fil contains:
  425.  
  426. Blank, 1, 0
  427. SSN, 1, 9
  428. Last Name, 10, 10
  429. Sex, 20, 1
  430. Birth Date, 21, 6
  431. $Endfile
  432.  
  433. Then the resulting report in @Compare.@R@ is identical to the one shown
  434. above, except that the Key Value column is blank, and the message about
  435. the Key Values not matching is gone.  The report in @Compare.@S@ is also
  436. identical to the one shown above, except that the Key Value column is
  437. blank.
  438.  
  439. Finally, suppose Example.fil contains field definitions which are out of
  440. sequence, or which overlap other definitions, or which leave gaps, or
  441. which do not account for some discrepancy which might be encountered, as
  442. follows:
  443.  
  444. Last Name,      10,  10
  445. Area Number,     1,   3
  446. Birth Year,     25,   2
  447. SSN,             1,   9
  448. Group Number,    4,   2
  449. Birth Month,    21,   2
  450. Birthdate,      21,   6
  451. Serial Number,   6,   4
  452. Birth Day,      23,   2
  453. $Endfile
  454.  
  455. Note that in this case, Last Name becomes the Key Variable.
  456.  
  457. Then the resulting report is as follows:
  458.  
  459. ┌───────────────╥───────────────╥──────────────────────╥──────────────────────┐
  460. │   Key Value   ║   Var Name    ║     Example1.dat     ║     Example2.dat     │
  461. ├───────────────╫───────────────╫──────┬───────────────╫──────┬───────────────┤
  462. │               ║               ║ Line │     Value     ║ Line │     Value     │
  463. ╞═══════════════╬═══════════════╬══════╪═══════════════╬══════╪═══════════════╡
  464. │    Madsen     ║     Birthdate ║    1 │        043064 ║    1 │        043164 │
  465. │    Madsen     ║     Birth Day ║    1 │            30 ║    1 │            31 │
  466. ├───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┤
  467. │                            ! ! ! WARNING ! ! !                              │
  468. │            Line    3 of Example1.dat not found in Example2.dat.             │
  469. ├───────────────╥───────────────╥──────┬───────────────╥──────┬───────────────┤
  470. │    Kley       ║     Last Name ║    5 │    Kley       ║    4 │    Clay       │
  471. ├───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┤
  472. │                            ! ! ! WARNING ! ! !                              │
  473. │               Key values in files (shown above) do not match!               │
  474. │                  Any discrepancies reported may be caused                   │
  475. │                     by different cases being compared.                      │
  476. ├───────────────╥───────────────╥──────┬───────────────╥──────┬───────────────┤
  477. │    Kley       ║           SSN ║    5 │     567890123 ║    4 │     567899123 │
  478. │    Kley       ║ Serial Number ║    5 │          0123 ║    4 │          9123 │
  479. │    Na         ║     Last Name ║    6 │    Na         ║    5 │    Arthur     │
  480. ├───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┤
  481. │                            ! ! ! WARNING ! ! !                              │
  482. │               Key values in files (shown above) do not match!               │
  483. │                  Any discrepancies reported may be caused                   │
  484. │                     by different cases being compared.                      │
  485. ├───────────────╥───────────────╥──────┬───────────────╥──────┬───────────────┤
  486. │    Na         ║   Birth Month ║    6 │            10 ║    5 │            12 │
  487. │    Na         ║     Birthdate ║    6 │        102664 ║    5 │        120664 │
  488. │    Na         ║     Birth Day ║    6 │            26 ║    5 │            06 │
  489. └───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┘
  490.  
  491. Then the resulting sorted report is as follows:
  492.  
  493. ┌───────────────╥───────────────╥──────────────────────╥──────────────────────┐
  494. │   Key Value   ║   Var Name    ║     Example1.dat     ║     Example2.dat     │
  495. ├───────────────╫───────────────╫──────┬───────────────╫──────┬───────────────┤
  496. │               ║               ║ Line │     Value     ║ Line │     Value     │
  497. ╞═══════════════╬═══════════════╬══════╪═══════════════╬══════╪═══════════════╡
  498. │    Kley       ║     Last Name ║    5 │    Kley       ║    4 │    Clay       │
  499. │    Na         ║     Last Name ║    6 │    Na         ║    5 │    Arthur     │
  500. │    Kley       ║           SSN ║    5 │     567890123 ║    4 │     567899123 │
  501. │    Na         ║   Birth Month ║    6 │            10 ║    5 │            12 │
  502. │    Madsen     ║     Birthdate ║    1 │        043064 ║    1 │        043164 │
  503. │    Na         ║     Birthdate ║    6 │        102664 ║    5 │        120664 │
  504. │    Kley       ║ Serial Number ║    5 │          0123 ║    4 │          9123 │
  505. │    Madsen     ║     Birth Day ║    1 │            30 ║    1 │            31 │
  506. │    Na         ║     Birth Day ║    6 │            26 ║    5 │            06 │
  507. └───────────────╨───────────────╨──────┴───────────────╨──────┴───────────────┘
  508.  
  509. Note that the sex variable discrepancy was not reported because there was
  510. no field definition which enclosed the twentieth column.  Note also that
  511. some discrepancies are repeated (in both the Birth Day and Birthdate
  512. fields) because several variables were defined which enclosed those
  513. columns.  Note that the @S@ sorted report file lists variables in the
  514. order in which they were defined.
  515.  
  516. By the way, the three parts of your social security number are known as
  517. the area, group, and serial numbers, respectively.  See "The Social
  518. Security Number," Pub. No. 05-10633, from the Federal Government.
  519.  
  520.  
  521.  
  522. SHAREWARE NOTICE:  ════════════════════════════════════════════════════════
  523.  
  524. @Compare is shareware, and is not in the public domain.  If you use
  525. @Compare and find it useful and valuable, please register by sending me a
  526. postcard with your name and address.  My address is at the end of this
  527. document.  I'm not asking for any money, although I won't turn you down if
  528. you're feeling generous.  Mainly, I'm just interested in seeing how far
  529. this thing spreads, and who's using it for what.
  530.  
  531. By registering, you'll be the first to receive news of any updates to
  532. @Compare, and you'll receive instantaneous fixes for any bugs you might
  533. happen to discover.
  534.  
  535.  
  536.  
  537. FINAL COMMENTS:  ══════════════════════════════════════════════════════════
  538.  
  539. This program began as an intellectual and educational exercise, but has
  540. since grown to become a useful tool for many people, which I have found
  541. deeply satisfying.  I welcome comments, suggestions for improvement, and
  542. bug reports.  I have received and incorporated many good suggestions for
  543. improvement, and I suspect that this will continue.
  544.  
  545. Please feel free to contact me:
  546.  
  547. Brian C. Madsen
  548. 5948 Madison Drive
  549. The Colony, Texas  75056-4487
  550.  
  551.  
  552.  
  553. FINIS:  ═══════════════════════════════════════════════════════════════════
  554.